// Rubrica.cpp : Defines the entry point for the console application.
/*
Scrivere un programma che attraverso un menù permetta di realizzare la rubrica telefonica.
Ogni contatto viene individuato da un nominativo e un numero telefonico
Il software deve eseguire:
Inserimento contatto (nome, cognome, numero di telefono)
Visualizza contatto
Ricerca contatto (nome e cognome)
Ricerca contatto (numero)
Ordina rubrica in modo crescente
*/

#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <time.h>

#define CONTATTI 10
#define NOMEMIN 2
#define CGNMIN NOMEMIN
#define ALFABETO 65
#define ALFALEN 25
#define NUMMIN 48
#define NUMERAND 9
#define NOMELEN 8
#define COGNOLEN NOMELEN
#define NUMLEN NOMELEN
#define TERM 1

using namespace std;

typedef struct 
{
	char nome[NOMELEN + TERM];
	char cognome[COGNOLEN + TERM];
	char numero[NUMLEN + TERM];
}CONTATTO;

void menu();
void inserisci(CONTATTO rubrica[], int *index, bool *random);
void inserisci_rand(CONTATTO rubrica[], int *index, bool *random);
void visualizza_rubrica(CONTATTO rubrica[], int *index);
void visualizza_contatto(CONTATTO rubrica[], int pos);
void ricerca_ncgn(CONTATTO rubrica[]);
void ricerca_numero(CONTATTO rubrica[]);
void ordina(CONTATTO rubrica[]);

int main()
{
	srand(time(NULL));
	menu();
	system("pause");
    return 0;
}

void menu()
{
	CONTATTO rubrica[CONTATTI];
	int scelta;
	int index = 0;
	bool random = false;
	do
	{
		system("cls");
		printf("0. Esci\n");
		printf("1. Inserisci contatto random\n");
		printf("2. Inserisci contatto manualmente\n");
		printf("3. Visualizza contatti\n");
		printf("4. Ricerca per nome o cognome\n");
		printf("5. Ricerca per numero\n");
		printf("6. Ordina\n");
		scanf_s("%d", &scelta, sizeof(int));
		switch (scelta)
		{
		case 1:
			inserisci_rand(rubrica, &index, &random);
			break;
		case 2:
			inserisci(rubrica, &index, &random);
			break;
		case 3:
			visualizza_rubrica(rubrica, &index);
			break;
		case 4:
			ricerca_ncgn(rubrica);
			break;
		case 5:
			ricerca_numero(rubrica);
			break;
		case 6:
			ordina(rubrica);
			break;
		}
	} while (scelta != 0);
}

void inserisci(CONTATTO rubrica[], int *index, bool *random)
{
	if (*random == true)
	{
		*index = 0;
	}
	if (*index <= CONTATTI)
		for (int j = 0; j < CONTATTI; j++)
		{
			printf("Inserisci nome contatto no. %d:\n", j + 1);
			scanf_s("%s", rubrica[j].nome, NOMELEN + 1);
			printf("Inserisci cognome contatto no. %d:\n", j + 1);
			scanf_s("%s", rubrica[j].cognome, COGNOLEN + 1);
			printf("Inserisci numero contatto no. %d:\n", j + 1);
			scanf_s("%s", rubrica[j].numero, NUMLEN + 1);
			printf("\n\n");
			*index += 1;
		}
	else
		printf("Rubrica piena!\n\n");
	system("pause");
}

void inserisci_rand(CONTATTO rubrica[], int *index, bool *random)
{
	if (*random == false)
	{
		*index = 0;
		*random = true;
	}
	int x;
	for (int j = 0; j < CONTATTI; j++)
	{
		do
		{
			x = 1+rand() % NOMELEN;
		} while (x>=NOMELEN);
		for (int i = 0; i < x; i++)
		{
			rubrica[j].nome[i] = (char)ALFABETO + rand() % ALFALEN;
		}
		rubrica[j].nome[x] = '\0';
		do
		{
			x = 1+rand() % COGNOLEN;
		} while (x>=COGNOLEN);
		for (int i = 0; i < x; i++)
		{
			rubrica[j].cognome[i] = (char)ALFABETO + rand() % ALFALEN;
		}
		rubrica[j].cognome[x] = '\0';
		do
		{
			x = 1+rand() % NUMERAND;
		} while (x>=NUMLEN);
		for (int i = 0; i < x; i++)
		{
			rubrica[j].numero[i] = (char)NUMMIN + rand() % NUMERAND;
		}
		rubrica[j].numero[x] = '\0';
		*index+=1;
	}
}

void visualizza_rubrica(CONTATTO rubrica[], int *index)
{
	for (int j = 0; j < *index; j++)
	{
		printf("Contatto no. %d:\n", j + 1);
		printf("Nome: %s\n", rubrica[j].nome);
		printf("Cognome: %s\n", rubrica[j].cognome);
		printf("Numero: %s\n\n", rubrica[j].numero);
	}
	system("pause");
}

void visualizza_contatto(CONTATTO rubrica[], int pos)
{
	printf("Contatto no. %d:\n", pos);
	printf("Nome: %s\n", rubrica[pos].nome);
	printf("Cognome: %s\n", rubrica[pos].cognome);
	printf("Numero: %s\n\n", rubrica[pos].numero);
}

void ricerca_ncgn(CONTATTO rubrica[])
{
	char nome[NOMELEN + TERM];
	char cognome[COGNOLEN + TERM];
	printf("Inserire nome:\n");
	scanf_s("%s", nome, NOMELEN + TERM);
	printf("Inserire cognome:\n");
	scanf_s("%s", cognome, COGNOLEN + TERM);
	for (int j = 0; j < CONTATTI; j++)
	{
		if ((strcmp(nome, rubrica[j].nome) == 0) && (strcmp(cognome, rubrica[j].cognome) == 0))
		{
			printf("Trovato tramite nome e cognome alla posizione %d\n", j);
			visualizza_contatto(rubrica, j);
		}
		else
		if (strcmp(nome, rubrica[j].nome) == 0)
		{
			printf("Trovato tramite nome alla posizione %d\n", j);
			visualizza_contatto(rubrica, j);
		}
		else
		if (strcmp(cognome, rubrica[j].cognome) == 0)
		{
			printf("Trovato tramite cognome alla posizione %d\n", j);
			visualizza_contatto(rubrica, j);
		}
	}
	system("pause");
}

void ricerca_numero(CONTATTO rubrica[])
{
	char numero[NUMLEN+TERM];
	printf("Inserire numero:\n");
	scanf_s("%s", numero, NUMLEN + TERM);
	for (int j = 0; j < CONTATTI; j++)
	{
		if (strcmp(numero, rubrica[j].numero) == 0)
		{
			printf("Trovato alla posizione %d\n", j);
			visualizza_contatto(rubrica, j);
		}
	}
	system("pause");
}

void ordina(CONTATTO rubrica[])
{
	CONTATTO temp;
	for (int j = 0; j < CONTATTI; j++)
	{
		for (int i = 0; i < CONTATTI; i++)
		{
			if (strcmp(rubrica[i].cognome, rubrica[j].cognome)>0)
			{
				temp = rubrica[i];
				rubrica[i] = rubrica[j];
				rubrica[j] = temp;
			}
		}
	}
}